CArchive序列化 您所在的位置:网站首页 qt 序列化存储 CArchive序列化

CArchive序列化

2024-07-13 20:14| 来源: 网络整理| 查看: 265

实现序列化的类必须满足下列条件:

   1. 该类需要从CObject类派生(可以是间接派生);

   2. 在类中中进行DECLARE_SERIAL宏定义;

   3. 类存在有缺省的构造函数;

   4. 类中实现了Serialize()函数,并且在其中调用基类的序列化函数;

   5. 使用IMPLEMENT_SERIAL宏指明类名及版本号;                       

比如下面CPerson类:

#ifndef _CPERSON_H #define _CPERSON_H class CPerson : public CObject { DECLARE_SERIAL(CPerson) private: CString _name; int _age; BOOL _gender; public: CPerson(); CPerson(CString name, int age, bool gender = true); void printInfo(); virtual void Serialize(CArchive& ar); }; #endifCPP文件:

#include "stdafx.h" #include "mfc_person.h" IMPLEMENT_SERIAL(CPerson, CObject, 1) CPerson::CPerson() { } CPerson::CPerson(CString name, int age, bool gender) { _name = name; _age = age; _gender = gender; } void CPerson::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar_name this->_name >> this->_age >> this->_gender; } } void CPerson::printInfo() { if(_gender) _tprintf("name: %s, male, %d\n",_name,_age); else _tprintf("name: %s, female, %d\n",_name,_age); } #include "stdafx.h" #include "CArchiveTest.h" #include "mfc_person.h" using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { setlocale(LC_ALL, "chs"); CPerson hxf(_T("hxff"), 28, FALSE); CPerson hsf(_T("hsff"), 27, TRUE); CFile oFile(_T("persons.dat"),CFile::modeCreate|CFile::modeWrite); CArchive oar(&oFile, CArchive::store); oar p1 >> p2; p1 = (CPerson*)iar.ReadObject(RUNTIME_CLASS(CPerson)); p2 = (CPerson*)iar.ReadObject(RUNTIME_CLASS(CPerson)); p1->printInfo(); p2->printInfo(); delete p1; delete p2; return 0; }

序列化是指对象将其状态保存在一个字节流中,并用该字节流重建对象。实例化实现了文档数据的保存和装入的幕后工作,MFC通过序列化实现了应用程序的文档读写功能。

序列化的基本思想是:一个类应该能够对自己的成员变量的数据进行读写操作,对象可以通过读操作而重新创建。即对象可以将其当前状态(由其成员变量的值表示)写入永久性存储体(通常指磁盘)中,以后可以从永久性存储体中读取(载入)对象的状态,从而重建对象。类的对象自己应该具备将状态值写入磁盘或从磁盘中读出的方法(即成员函数),这种对象的保存和恢复过程称为序列化。

文档数据的序列化操作通过CArchive类对象作为中介来完成。CArchive类对象由应用程序框架创建,并与用户正在使用的文件关联在一起。

CArchive类对象为读写CFile类对象中的可序列化数据提供了一种安全的缓冲机制,它们之间形成了如下关系:

Serialize()函数   CArchive类对象 CFile类对象磁盘文件

一个可序列化的类必须有一个称作为序列化的成员函数Serialize(),文档的序列化在文档类的成员函数Serialize()中进行。

当用户选择文件菜单中的New,Open,Save和Save as 等菜单命令时,都会调用文档类的派生类的成员函数Serialize(),实现与序列化有关的操作。

CArchive类对象是单向的,即不能通过一个CArchive类对象既进行文档的保存,又进行文档的读取。通过调用CArchive类的成员函数IsStoring()来检索当前CArchive类对象的属性。如果CArchive类对象是用于写数据,函数IsStoring()返回TRUE;如果CArchive类对象是用于读数据,函数IsStoring()返回FALSE。

CArchive类对象使用重载的插入()操作符执行读和写操作。这种方式与cin和cout中的输入输出流非常相似,只是这里处理的是对象,而cin和cout处理的是ASCII字符串。

注意,MFC应用程序文件的序列化与其他不使用MFC序列化程序的文件格式并不兼容。若读写一般格式的文件,如TEXT,可直接使用CFile类及其派生类。

部分内容摘自网络: http://blog.163.com/xin_qing2010/blog/static/177737358201152693654941/



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有